1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  package com.macvu.tiles.xmlDefinition;
63  
64  import org.apache.struts.tiles.*;
65  
66  import javax.servlet.ServletContext;
67  import javax.servlet.ServletRequest;
68  import java.util.HashMap;
69  import java.util.Iterator;
70  import java.util.Map;
71  
72  public abstract class CacheFactorySet implements ComponentDefinitionsFactory {
73  
74      /***
75       * Loaded factories
76       */
77      protected Map factories = null;
78  
79      /***
80       * Extract key that will be used to get the sub factory.
81       *
82       * @param name           Name of requested definition.
83       * @param request        Current servlet request.
84       * @param servletContext Current servlet context.
85       * @return Object.
86       */
87      abstract protected Object getDefinitionsFactoryKey(String name, ServletRequest request, ServletContext servletContext);
88  
89      /***
90       * Get default factory.
91       *
92       * @return Default factory.
93       */
94      abstract protected CacheDefinitionFactory getDefaultFactory();
95  
96      /***
97       * Get a factory by its key.
98       * If key is <code>null</code>, return defaultFactory.
99       * Search in loaded factories. If not found, create factory and store return value in
100      * loaded factories.
101      *
102      * @param key            Key of requested definition.
103      * @param request        Current servlet request.
104      * @param servletContext Current servlet context.
105      * @throws org.apache.struts.tiles.DefinitionsFactoryException
106      *          If an error occur while creating factory.
107      */
108     protected CacheDefinitionFactory getFactory(Object key, ServletRequest request, ServletContext servletContext)
109             throws DefinitionsFactoryException {
110         if (key == null)
111             return getDefaultFactory();
112 
113         Object factory = factories.get(key);
114         if (factory == null) {
115             
116             
117             
118             synchronized (factories) {
119                 factory = factories.get(key);
120                 if (factory == null) {
121                     factory = createFactory(key, request, servletContext);
122                     factories.put(key, factory);
123                 } 
124             } 
125         } 
126         return (CacheDefinitionFactory) factory;
127     }
128 
129     /***
130      * Get a definition by its name.
131      *
132      * @param name           Name of requested definition.
133      * @param request        Current servlet request.
134      * @param servletContext Current servlet context.
135      * @throws org.apache.struts.tiles.NoSuchDefinitionException
136      *                                     No definition found for specified name
137      * @throws DefinitionsFactoryException General exception
138      */
139     public ComponentDefinition getDefinition(String name, ServletRequest request, ServletContext servletContext)
140             throws NoSuchDefinitionException, DefinitionsFactoryException {
141         if (factories == null)
142             throw new FactoryNotFoundException("No definitions factory defined");
143 
144         Object key = getDefinitionsFactoryKey(name, request, servletContext);
145         CacheDefinitionFactory factory = getFactory(key, request, servletContext);
146         return factory.getDefinition(name, request, servletContext);
147     }
148 
149     /***
150      * Create a factory for specified key.
151      * This method is called by getFactory() when the requested factory doesn't already exist.
152      * Must return a factory, or a default one.
153      * Real implementation needs to provide this method.
154      *
155      * @param key            Key of requested definition.
156      * @param request        Current servlet request.
157      * @param servletContext Current servlet context
158      * @throws DefinitionsFactoryException If an error occur while creating factory.
159      */
160     abstract protected CacheDefinitionFactory createFactory(Object key, ServletRequest request, ServletContext servletContext)
161             throws DefinitionsFactoryException;
162 
163     /***
164      * Init factory set.
165      *
166      * @param servletContext Current servlet context
167      * @param properties     properties used to initialized factory set;
168      */
169     abstract public void initFactory(ServletContext servletContext, Map properties)
170             throws DefinitionsFactoryException;
171 
172     /***
173      * Constructor.
174      */
175     public CacheFactorySet() {
176         factories = new HashMap();
177     }
178 
179     /***
180      * Return String representation.
181      *
182      * @return String representation.
183      */
184     public String toString() {
185         Iterator i = factories.values().iterator();
186         StringBuffer buff = new StringBuffer("all FactorySet's factory : \n");
187         while (i.hasNext()) {
188             buff.append(i.next().toString()).append("\n");
189         }
190         return buff.toString();
191     }
192 
193 }